//
//  SHUserAccountViewModel.swift
//  SHWeibo
//
//  Created by jingming wang on 16/7/25.
//  Copyright © 2016年 cpy.name. All rights reserved.
//

import UIKit

class SHUserAccountViewModel: NSObject {
    // 路径
    let file = (NSSearchPathForDirectoriesInDomains(.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last! as NSString).stringByAppendingPathComponent("userAccount.archiver")
    
    // 全局访问点
    static let sharedTools: SHUserAccountViewModel = SHUserAccountViewModel()
    
    //创建一个用户模型
    var userAccount: SHUserAccount?
    
    // 使用accessToken
    /*
    - 为什么使用计算型属性？
    - 时刻拿到accessToken 是否过期 要时刻和当前使用的日期对比 才准确 所以使用计算型属性
    */
    var accessToken: String? {
        //判断用户的accessToken是否有值
        if userAccount?.access_token != nil {
            // 判断是否过期
            // 当前保存的日期与当前日期对比 如果为降序 表示未过期
            if userAccount?.expires_date?.compare(NSDate()) == NSComparisonResult.OrderedDescending {
                return userAccount?.access_token
            }else {
                print("access_token已过期")
                return nil
            }
        }else {
            // 代表没有accessToken
            /*
            - 代表用户没有登录 或者没有保存数据
            */
            return nil
        }
    }
    // 通过accessToken是否为nil 来判断用户是否登录
    var isLogin: Bool {
        return accessToken != nil
    }
    
    override init() {
        super.init()
        userAccount = getUserAccount()
    }
}

//MARK: - 归档解档
extension SHUserAccountViewModel {
    // 保存对象
    func saveUserAccount(userAccount: SHUserAccount) {
        // 为了解决第一次的userAccount为nil的bug
        self.userAccount = userAccount
        // 保存对象
        NSKeyedArchiver.archiveRootObject(userAccount, toFile: file)
    }
    // 获取对象
    func getUserAccount() -> SHUserAccount? {
        let userAccount = NSKeyedUnarchiver.unarchiveObjectWithFile(file) as? SHUserAccount
        return userAccount
    }
}

// MARK: - 请求数据
extension SHUserAccountViewModel{
    // 请求userAccount
    func loadUserAccount(code: String, succeed:(isSucc: Bool)->()){
        SHNetworkTools.sharedTools.oauthLoadUserAccount(code, success: { (response) -> () in
            // 当在guard 或者if let中 使用as  一般情况下 都是使用as?
            // 判断response是否为nil 而且是否可以转成字典
            guard let res = response as? [String: AnyObject] else{
                succeed(isSucc: false)
                return
            }
            // 字典转模型
            let userAccount = SHUserAccount(dict: res)
            self.loadUserInfo(userAccount, succeed: succeed)
            }) { (error) -> () in
                print("请求失败\(error)")
                succeed(isSucc: false)
        }
    }
    // 请求用户信息
    func loadUserInfo(userAccount: SHUserAccount, succeed:(isSucc: Bool)->()){
        SHNetworkTools.sharedTools.oauthLoadUserInfo(userAccount, success: { (response) -> () in
            // 判断response是否为nil 而且是否可以转成字典
            guard let res = response as? [String: AnyObject] else{
                succeed(isSucc: false)
                return
            }
            // 因为当前的screen_name 和avatar_large 本来就是可选值 所以在as的时候 只用as? 转字符串
            // 给其userAccount身上两个为nil的属性赋值
            userAccount.screen_name = res["screen_name"] as? String
            userAccount.avatar_large = res["avatar_large"] as? String
            print(userAccount)
            // 通过归档保存数据
            self.saveUserAccount(userAccount)
            succeed(isSucc: true)
            }) { (error) -> () in
                print("请求失败:\(error)")
                succeed(isSucc: false)
        }
    }
}

